package com.example.mytest6;

import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.github.mikephil.charting.charts.HorizontalBarChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class MyFragment3 extends Fragment {


    private HorizontalBarChart hbr1;

    public MyFragment3() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.myfragment3, container, false);
        initView(view);
        initData();
        return view;
    }

    private void initData() {
        //设置图表的描述文字
        hbr1.setDescription(null);
        //禁止缩放
        hbr1.setScaleEnabled(false);

        //图例
        hbr1.getLegend().setEnabled(false);

        //设置额外的偏移，将被添加到自动计算的偏移。 这不会改变自动计算的偏移量，但增加了额外的空间给它们。  相当于 padding
        hbr1.setExtraOffsets(10, 0, 20, 20);

        //"x轴"内容
        final List<String> xV = new ArrayList<>();
        xV.add("1--2条违章");
        xV.add("3--5条违章");
        xV.add("5条以上违章");

        //数据线集合
        List<BarEntry> Value = new ArrayList<>();
        Value.add(new BarEntry(0, 60.51f));
        Value.add(new BarEntry(1, 26.28f));
        Value.add(new BarEntry(2, 13.20f));
        //dataSet数据线    负责数据加载  和 数据设置
        BarDataSet dataSet = new BarDataSet(Value, "");
        //设置颜色
        int color[] = {Color.GREEN, Color.BLUE, Color.RED};
        dataSet.setColors(color);

        // 启用/禁用 绘制所有 DataSets 数据对象包含的数据的值文本。
        dataSet.setDrawValues(true);
        //数据标签的颜色和大小
        dataSet.setValueTextColor(Color.BLACK);
        dataSet.setValueTextSize(15);

//        轴依赖
//        默认情况下，添加到图表的所有数据都会对照图表的左侧YAxis。
//        如果没有进一步指定和启用，则右侧YAxis将调整为表示与左侧轴相同的比例。
//        默认情况下，添加到图表的所有数据都将相对图表的左侧YAxis进行绘图。
//        如果未进一步指定和启用，则右侧YAxis将调整为表示与左侧轴相同的比例。
//        如果你的图表需要支持不同的轴刻度，你可以通过设置数据应绘制的轴来实现。
//        这可以通过更改DataSet对象的Axis Dependency来实现：
        //如果不给    会导致数据标签无法绘制
        dataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
        //数据标签的格式化
        dataSet.setValueFormatter(new MyBarDataFormatter());
        //高亮关闭
        dataSet.setHighlightEnabled(false);

        //y轴设置右轴开启
        YAxis yAxis = hbr1.getAxisRight();
        //setLabelCount(int count, boolean force) : 设置y轴的标签数量。
        // 请注意，这个数字是不固定 if(force == false)，只能是近似的。
        // 如果 if(force == true)，则确切绘制指定数量的标签，但这样可能导致轴线分布不均匀。
        yAxis.setLabelCount(8, true);
        yAxis.setAxisMinimum(0);
        yAxis.setAxisMaximum(70);
        //垂线
        yAxis.setDrawGridLines(false);
        //为了解决可能导致轴线分布不均匀问题 ，设置轴线平均分
        yAxis.setGranularity(1);
        //y轴数据格式化
        yAxis.setValueFormatter(new MyYAxisFormatter());

        //y轴设置左轴关闭
        YAxis left = hbr1.getAxisLeft();
        //绘制轴的标签   禁止
        left.setDrawLabels(false);
        //设置网格线   false
        left.setDrawGridLines(false);
        //绘制y轴    false
        left.setDrawAxisLine(false);
        left.setAxisMaximum(70);
        left.setAxisMinimum(0);
        left.setLabelCount(8, true);

        //设置x轴
        XAxis xAxis = hbr1.getXAxis();
        //x轴位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        //网格线   谁的就与谁平行
        xAxis.setDrawGridLines(false);
        xAxis.setTextSize(14);
        //x轴数据平均发布
        xAxis.setGranularity(1);
        //x轴读入数据
        xAxis.setValueFormatter(new MyXAxisFormatter(xV));
        //    data是BarData实例 bar数据
        BarData data = new BarData(dataSet);
        data.setBarWidth(0.5f);
        hbr1.setData(data);
    }

    private void initView(View view) {
        hbr1 = (HorizontalBarChart) view.findViewById(R.id.hbar_1);
    }

    class MyXAxisFormatter extends ValueFormatter {
        List<String> xV = new ArrayList<>();

        public MyXAxisFormatter(List<String> xV) {
            this.xV = xV;
        }

        @Override
        public String getFormattedValue(float value) {
            return xV.get((int) value);
        }
    }

    class MyYAxisFormatter extends ValueFormatter {
        public MyYAxisFormatter() {
        }

        @Override
        public String getFormattedValue(float value) {
            return new DecimalFormat("0.00%").format(value / 100);
        }
    }

    class MyBarDataFormatter extends ValueFormatter {
        @Override
        public String getBarLabel(BarEntry barEntry) {
            return new DecimalFormat("0.00%").format(barEntry.getY() / 100);
        }
    }
}